package co.edu.uniandes.sd.mundo;

import java.io.Serializable;
import java.util.ArrayList;

public class ModificacionArchivo implements Serializable{

	private static final long serialVersionUID = 581639789627883982L;

	public enum EstadoModificacion{PENDIENTE, EN_CURSO}
	
	/**
	 * Estado de la modificacion
	 */
	private EstadoModificacion estadoModificacion;
	
	/**
	 * Momento de creacion de la modificacion
	 */
	private long timestamp;
	
	/**
	 * Identificacion del archivo que se esta modificando
	 */
	private String identificadorArchivo;
	
	/**
	 * Lista con los nodos que tambien estan pendientes de modificacion y a los cuales se les debe pedir permiso
	 */
	private ArrayList<String> nodosEnConflicto;
	
	/**
	 * Lista con los nodos pendientes por avisar
	 */
	private ArrayList<String> nodosPendientesPorAvisar;

	
	
	public ModificacionArchivo(long timestamp, String identificadorArchivo) {
		super();
		this.timestamp = timestamp;
		this.identificadorArchivo = identificadorArchivo;
		estadoModificacion = EstadoModificacion.PENDIENTE;
		nodosPendientesPorAvisar = new ArrayList();
		nodosEnConflicto = new ArrayList();
	}

	public EstadoModificacion getEstadoModificacion() {
		return estadoModificacion;
	}

	public void setEstadoModificacion(EstadoModificacion estadoModificacion) {
		this.estadoModificacion = estadoModificacion;
	}

	public long getTimestamp() {
		return timestamp;
	}

	public void setTimestamp(long timestamp) {
		this.timestamp = timestamp;
	}

	public String getIdentificadorArchivo() {
		return identificadorArchivo;
	}

	public void setIdentificadorArchivo(String identificadorArchivo) {
		this.identificadorArchivo = identificadorArchivo;
	}

	public ArrayList<String> getNodosEnConflicto() {
		return nodosEnConflicto;
	}

	public void setNodosEnConflicto(ArrayList<String> nodosEnConflicto) {
		this.nodosEnConflicto = nodosEnConflicto;
	}

	public ArrayList<String> getNodosPendientesPorAvisar() {
		return nodosPendientesPorAvisar;
	}

	public void setNodosPendientesPorAvisar(
			ArrayList<String> nodosPendientesPorAvisar) {
		this.nodosPendientesPorAvisar = nodosPendientesPorAvisar;
	}
	
	public void agregarNodoEnConflicto(String id){
		nodosEnConflicto.add(id);
	}
	
	public void confirmarPermiso(String id){
		for (int i = 0; i < nodosEnConflicto.size(); i++) {
			if(nodosEnConflicto.get(i).equals(id)){
				nodosEnConflicto.remove(i);
				i--;
				System.out.println("Permiso recibido->"+id);
			}
		}
		for (int i = 0; i < nodosEnConflicto.size(); i++) {
			System.out.println("Nodo conflicto->"+nodosEnConflicto.get(i));
		}
		if(nodosEnConflicto.size()==0){
			estadoModificacion=EstadoModificacion.EN_CURSO;
		}
	}
	
	public boolean pedirPermiso(String id, long timestamp){
		if(estadoModificacion == EstadoModificacion.PENDIENTE && timestamp <= this.timestamp){
			return true;
		}else{
			nodosPendientesPorAvisar.add(id);
			for (String nodo : nodosPendientesPorAvisar) {
				System.out.println("Pendiente por avisar->"+nodo);
			}
			return false;
		}
	}
	
	public String aplanarNodosEnConflicto()
	{
		String rta = "";
		for(int i=0; i<nodosEnConflicto.size(); i++)
		{
			rta+=nodosEnConflicto.get(i)+"\n";
		}
		return rta;
	}
	
	public String aplanarNodosPorAvisar()
	{
		String rta = "";
		for(int i=0; i<nodosPendientesPorAvisar.size(); i++)
		{
			rta+=nodosPendientesPorAvisar.get(i)+"\n";
		}
		return rta;
	}
	
	public String toString()
	{
		return "$$$Estado:"+estadoModificacion+"\n"+
		"$$$Tiempo:"+timestamp+"\n"+
		"$$$Archivo:"+identificadorArchivo+"\n"+
		"$$$Nodos en Conflicto:"+aplanarNodosEnConflicto()+
		"$$$Nodos por Avisar:"+aplanarNodosPorAvisar();
	}
}
